#pragma once

#include "BasicType.h"
#include "As2Variable.h"
#include "Pool.h"

namespace LightPlayer{

	typedef array<As2Var*>									As2Var_Stack; 
	typedef pool<As2Var>									As2Var_Pool; 
	typedef string											var_name_type;
	typedef As2Var											var_value_type;
	typedef dictionary<var_name_type,var_value_type>		var_list_type;

	class As2VM{
		As2Var_Pool		m_VarPool;
		As2Var_Stack	m_Stack;
		
		// constant pool
		// var list
	public:
		As2VM();
		void init();

		void push_null();
		void push_undef();
		void push_str(const char* str);
		void push_NewStr(const char* str);
		void push_float(float f);
		void push_register(uint8 u);
		void push_bool(bool b);
		void push_double(double d);
		void push_int(int i);
		void push_constant(uint16 ui);
		void push_As2Var(const As2Var& value);

		As2Var pop();

		// Arithmetic operator
		void DoAdd();
		void DoSub();
		void DoMult();
		void DoDiv();
		// Numerical comparison
		void DoEquals();
		void DoLess();
		// Logical operators
		void DoAnd();
		void DoOr();
		void DoNot();
		// String manipulation
		void DoStringEquals();
		void DoStringLength();
		void DoStringAdd();
		void DoStringExtract();
		void DoStringLess();
		void DoMBStringLength();
		void DoMBStringExtract();
		// Type conversion
		void DoToInteger();
		void DoCharToAscii();
		void DoAsciiToChar();
		void DoMBCharToAscii();
		void DoMBAsciiToChar();
	};

};